package com.example.mq.server.core;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.HashMap;
import java.util.Map;

/*
* 交换机
* */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Exchange{
    private String name;// 名称作为交换机的唯一标识
    // 交换机类型可以分为三种 1.直接交换机(DIRECT) 2.扇出交换机(FANOUT) 3.主题交换机(TOPIC)
    private ExchangeType type = ExchangeType.DIRECT;
    // 持久化存储 true表示需要持久化存储,false表示不需要持久化存储
    private boolean durable = false;

    // 自动删除(暂时不实现,RabbitMq是有的) 不实现
    private boolean autoDelete = false;
    // arguments 是指创建交换机时可以指定的一些额外的参数选项,不实现
    private Map<String,Object> arguments = new HashMap<>();


    public String getArguments() {
        ObjectMapper objectMapper = new ObjectMapper();
        try {
            return objectMapper.writeValueAsString(arguments);
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }
        // 如果真的发生了异常,返回空的json字符串
        return "{}";
    }

    // 这个方法是从数据库读取后,构造Exchange对象时自动调用
    public void setArguments(String argumentsJson) {
        // 把参数中的argumentsJson转成Map
        ObjectMapper objectMapper = new ObjectMapper();
        try {
            this.arguments = objectMapper.readValue(argumentsJson, new TypeReference<HashMap<String,Object>>() {});
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }
    }

    public void setArguments(String key,Object value) {
        arguments.put(key,value);
    }

    public void setArguments(Map<String,Object> arguments){
        this.arguments = arguments;
    }

    public Object getArguments(String key){
        return arguments.get(key);
    }

}
